package main

// 函数
// func add(x int, y int) (sum int) {
// 	sum = x + y
// 	return sum
// }

// func main() {
// 	// res := add(1,2)
// 	fmt.Println(add(1, 2))
// }
// 函数变量
// func addSum(x int, y int) (sum int, sub int) {
// 	sum = x + y
// 	sub = x - y
// 	return sum, sub
// }

// func main() {
// 	a := 1
// 	b := 2
// 	// var f1 func(x int, y int) (sum int, sub int)  // 函数变量申明
// 	// f1 = addSum	// 函数变量 赋值
// 	f1 := addSum
// 	sum, sub := f1(a, b)
// 	fmt.Println(a, "+", b, "=", sum)
// 	fmt.Println(a, "-", b, "=", sub)
// }

// 可变参数
// func add(slice ...int) int {
// 	sum := 0
// 	for _, value := range slice {
// 		sum += value
// 	}
// 	return sum
// }

// func main() {
// 	fmt.Println("1+2+...=", add(1, 2, 3, 4))
// }

// 可变参数传递
// func addAll(slice ...int) {
// 	sum := 0
// 	for _, value := range slice {
// 		sum += value
// 	}
// 	fmt.Println(sum)
// 	fmt.Println(slice)
// }

// func add(num ...int) {
// 	addAll(num...)
// }

// func main() {
// 	add(1, 2, 3, 4, 5)
// }

// 匿名函数和闭包
// 1 定义并同时调用匿名函数
// func main() {
// 	func(data string) {
// 		fmt.Println("Hello " + data)
// 	}("world")
// }
// 2 将匿名函数赋值给变量
// func main() {
// 	f1 := func(data string) {
// 		fmt.Println("Hello " + data)
// 	}
// 	f1("world")
// }

// 闭包定义 包含了自由变量的匿名函数， 其中自由变量即使已脱离原有的自由变量环境也不会被删除， 在闭包的
// 作用域可继续使用自由变量， 同一个匿名函数和不同的引用环境组成不同闭包

// 1 闭包的记忆力
// func main() {
// 	num := 1
// 	fmt.Printf("%p\n", &num)
// 	func() {
// 		num++
// 		fmt.Println(num)
// 		fmt.Printf("%p\n", &num)
// 	}()
// 	func() {
// 		num++
// 		fmt.Println(num)
// 		fmt.Printf("%p\n", &num)
// 	}()
// 	fmt.Println(num)
// 	fmt.Printf("%p\n", &num)
// }
// 0xc0000160b8
// 2
// 0xc0000160b8
// 3
// 0xc0000160b8
// 3
// 0xc0000160b8

// import "fmt"

// func addOne(i int) func() int {
// 	return func() int {
// 		i++
// 		return i
// 	}
// }

// func main() {
// 	a1 := addOne(0)
// 	fmt.Println(a1())
// 	fmt.Println(a1())
// 	a2 := addOne(10)
// 	fmt.Println(a2())
// 	fmt.Print("a1闭包的地址为:")
// 	fmt.Printf("%p\n", &a1)
// 	fmt.Print("a2闭包的地址为:")
// 	fmt.Printf("%p\n", &a2)

// }

// 延迟执行语句 defer
// import "fmt"

// func main() {
// 	fmt.Println("start now")
// 	defer fmt.Println("这是第一个defer")
// 	defer fmt.Println("这是第二个defer")
// 	defer fmt.Println("这是第三个defer")
// 	fmt.Println("end")
// }

// import (
// 	"fmt"
// 	"net"
// )

// func tcpSend() {
// 	conn, err := net.Dial("tcp", "www.baidu.com:80")
// 	if err == nil {
// 		defer conn.Close()
// 		fmt.Println("remote address:", conn.RemoteAddr())
// 		fmt.Println("error:", err)
// 	}
// }

// func main() {
// 	tcpSend()
// }

// h函数参数传递
// import "fmt"

// func passByValue(numPara int) { // 值传递
// 	fmt.Printf("passByValue函数中变量numPara地址为：%p\n", &numPara)
// 	numPara = 100
// }

// func passByReference(numPara *int) { // 引用传递
// 	fmt.Printf("passByReference函数中指针变量numPara地址为:%p\n", &numPara)
// 	fmt.Printf("passByReference函数中指针变量numPara指向地址为:%p\n", numPara)
// *numPara = 100
// }

// func main() {
// 	num := 1
// 	fmt.Printf("main函数中变量num地址为:%p\n", &num)
// 	passByValue(num)
// 	fmt.Printf("num变量值为:%d\n", num)
// 	passByReference(&num)
// 	fmt.Printf("num变量值为:%d\n", num)
// }

// // 使用map变量传递的是原变量的指针
// import "fmt"

// func passByReference(mapNumReference map[int]int) {
// 	fmt.Printf("passByRefernce函数中变量mapNumReference地址为:%p\n", mapNumReference)
// 	fmt.Printf("passByReference函数中变量mapNumReference所指针地址为:%p\n", &mapNumReference)
// 	mapNumReference[1] = 100
// }

// func main() {
// 	mapNum := map[int]int{1: 10}
// 	fmt.Printf("main函数中变量mapNum地址为:%p\n", mapNum)
// 	fmt.Printf("main函数中变量mapNum所属指针的地址为%p\n", &mapNum)
// 	fmt.Printf("mapNum变量值为:%d\n", mapNum)
// 	passByReference(mapNum)
// 	fmt.Printf("mapNum变量值为%d\n", mapNum)
// }

// 切片复制
// import "fmt"

// func main() {
// 	sourceSlice := []int{1, 2, 3}
// 	sourceSlice = append(sourceSlice, 4, 5, 6)
// 	fmt.Println("sourceSlice:", sourceSlice)

// 	// 切片元素复制
// 	targetSlice := []int{1, 1, 1}
// 	num := copy(targetSlice, sourceSlice)
// 	fmt.Println("复制成功的元素个数为:", num)
// 	fmt.Println("targetSlice:", targetSlice)
// 	fmt.Println("targetSlice切片长度为:", len(targetSlice))
// 	fmt.Println("targetSlice切片容量为:", cap(targetSlice))
// }

// complex 函数可创建复数
import "fmt"

func main() {
	c1 := complex(1, 2)
	fmt.Println(c1, "实部为:", real(c1))
	fmt.Println(c1, "虚部为:", imag(c1))
}
